﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed
#pragma once
#include "IPositionAssociatedPlane.h"

namespace gcmp
{
    class IDocument;
    /// \brief 两个关联平面定位类
    class GCMP_MODEL_INTERFACE_EXPORT IPositionTwoAssociatedPlanes : public IPositionAssociatedPlane
    {
        DEFINE_CAST_DERIVED(gcmp::IPositionTwoAssociatedPlanes, gcmp::IPositionAssociatedPlane)
    public:
        /// \brief 创建基于两个关联平面的定位对象
        /// \param pElement 元素指针
        /// \param bottomAssociatedPlaneId 底部关联平面id
        /// \param bottomAssociatedPlaneOffset 底部偏移
        /// \param topAssociatedPlaneId 顶部关联平面id
        /// \param topAssociatedPlaneOffset 底部偏移
        /// \return 基于两个关联平面的定位对象
        static OwnerPtr<IPositionTwoAssociatedPlanes> Create(IElement *pElement, const ElementId &bottomAssociatedPlaneId, double bottomAssociatedPlaneOffset, const ElementId &topAssociatedPlaneId, double topAssociatedPlaneOffset);
   
    public:
        /// \brief 得到底部关联平面id
        /// \return 底部关联平面id
        virtual ElementId GetBottomAssociatedPlaneId() const = 0;

        /// \brief 设置底部关联平面id
        /// \param associatedPlaneId 关联平面id
        /// \return 返回true表示成功设置，否则表示失败
        virtual bool SetBottomAssociatedPlaneId(const ElementId &associatedPlaneId) = 0;

        /// \brief 得到顶部关联平面id
        /// \return 顶部关联平面id
        virtual ElementId GetTopAssociatedPlaneId() const = 0;

        /// \brief 设置顶部关联平面id
        /// \param associatedPlaneId 关联平面id
        /// \return 返回true表示成功设置，否则表示失败
        virtual bool SetTopAssociatedPlaneId(const ElementId &associatedPlaneId) = 0;

        /// \brief 得到底部偏移量
        /// \return 底部偏移量
        virtual double GetBottomOffset() const = 0;

        /// \brief 设置底部偏移量
        /// \param value 偏移量
        /// \return 返回true表示成功设置，否则表示失败 
        virtual bool SetBottomOffset(double value) = 0;

        /// \brief 得到顶部偏移量
        /// \return 顶部偏移量
        virtual double GetTopOffset() const = 0;

        /// \brief 设置顶部偏移量
        /// \param value 偏移量
        /// \return 返回true表示成功设置，否则表示失败 
        virtual bool SetTopOffset(double value) = 0;

        /// \brief 得到顶部关联平面高度
        /// \return 顶部关联平面高度
        virtual double GetTopAssociatedPlaneHeight() const = 0;

        /// \brief 得到高度值
        /// \return 高度值
        virtual double GetHeight() const = 0;

        /// \brief 设置高度值
        /// \param value 高度值
        /// \return 返回true表示成功设置，否则表示失败 
        virtual bool SetHeight(double value) = 0;

        /// \brief 判断是否允许计算高度值
        /// \return 返回true表示允许计算高度值，否则表示不允许
        virtual bool ShouldCalculateHeight() const = 0;

        /// \brief 计算高度值 
        /// 
        /// 根据两个关联平面和偏移量计算出高度值
        /// \return 高度值 
        virtual double ComputeHeight() const = 0;
    };
}


